package com.smart.community.commons.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.smart.community.commons.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;

import java.time.LocalDateTime;

/**
 * MyBatis-Plus元数据处理器
 * 自动填充创建时间、更新时间、创建人、更新人等字段
 * 
 * 根据《Java后端SpringBoot代码开发规范.md》权威标准：
 * - 统一使用SecurityUtils作为获取当前用户信息的唯一标准工具类
 * - 禁止直接使用UserContext或UserContextUtils获取用户信息
 * - 遵循《智慧社区微服务架构总览.md》的架构设计原则
 *
 * @author Wu.Liang
 * @since 2025-07-05
 * @version 2.0.0
 */
@Slf4j
public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        log.debug("开始执行插入填充...");
        
        try {
            // 填充创建时间
            this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
            
            // 填充更新时间
            this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
            
            // 填充创建人ID
            Long currentUserId = getCurrentUserId();
            if (currentUserId != null) {
                this.strictInsertFill(metaObject, "createBy", Long.class, currentUserId);
            }
            
            // 填充更新人ID
            if (currentUserId != null) {
                this.strictInsertFill(metaObject, "updateBy", Long.class, currentUserId);
            }
            
            log.debug("插入填充完成，创建人ID: {}", currentUserId);
        } catch (Exception e) {
            log.warn("插入填充过程中发生异常: {}", e.getMessage());
            // 继续执行，不影响主业务流程
        }
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.debug("开始执行更新填充...");
        
        try {
            // 填充更新时间
            this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
            
            // 填充更新人ID
            Long currentUserId = getCurrentUserId();
            if (currentUserId != null) {
                this.strictUpdateFill(metaObject, "updateBy", Long.class, currentUserId);
            }
            
            log.debug("更新填充完成，更新人ID: {}", currentUserId);
        } catch (Exception e) {
            log.warn("更新填充过程中发生异常: {}", e.getMessage());
            // 继续执行，不影响主业务流程
        }
    }

    /**
     * 获取当前用户ID
     * 
     * 根据《Java后端SpringBoot代码开发规范.md》权威标准：
     * - 统一使用SecurityUtils.getCurrentUserId()获取当前用户ID
     * - 遵循《智慧社区微服务架构总览.md》的架构设计原则
     *
     * @return 当前用户ID，未登录时返回null
     */
    private Long getCurrentUserId() {
        try {
            return SecurityUtils.getCurrentUserId();
        } catch (Exception e) {
            log.warn("获取当前用户ID失败: {}", e.getMessage());
            return null;
        }
    }
} 